分类
联系方式
  1. 新浪微博
  2. E-mail

Maeiee Weekly No.23:Punk OS

前言

本周探索了一个好玩儿的主题,Punk OS。啥是 Punk OS?这来自我构思已久的一个想法。本周的 Weekly 来说道说道。

注:Punk OS 并不是完整操作系统,我是做 App 开发的,Punk OS 说白了只是个 App。

计算机与创造性

人人可使用计算机发挥创造性

个人计算机的出现,对于个人来说意义重大。

计算机延申了人的大脑,让人可以处理更多的信息,进行更加高级的统计、运算。

在互联网的帮助下,人也真正做到了“秀才不出门,便知天下事”。

个人的能力大大增强,结合人的创造性,个人能做到很多以往做不到的事情。

Unix、Emacs 的文化

Unix 的 Unix 工具哲学。Emacs 的一切可编程。

它们就像画布,而你手持画笔,你想要什么,就画什么。

计算机是完全为你服务的,你位于程序的中心。

塑造自己的生活

每个人都是一个独特的个体。

每个人有独特的做事方法,看待事物的方法。

通过编程、定制,计算机帮助把你的生活“系统化”。

云的商业模式

目前,一大部分计算机技术发展都是关于“云”的。

PC 时代的英雄们,从大型机厂商中,为人们争取到人人使用计算机的权利;如今我们又还了回去。

你的数据存在别人的电脑里

世界上没有云,只不过是别人的电脑而已。

这就好像把值钱的家当放在别人家,对方承诺你说:“只有你能看,别人都看不了,放心!”

社交网络的魅力

社交网络极大的推动了云商业模式的发展。

我是社交网络的支持者,也是积极参与者。我认为社交网络如同计算机一样,是另一个对个人的放大器。

我想说的是,社交网络的出现,向人们推动、普及了云服务。

现如今,人们已经习惯了使用 Google 账号登录各种云服务。使用云服务就像用离线软件一样。

人还在,云服务没了

每个云服务产品的背后都是一家商业公司。

商业公司生命周期其实是比较短的,大部分的宿命都会倒闭。

当这一刻发生时,自己的数据怎么办?

如果用户没能较好的完成数据交接,那这部分数据,以及数据背后的这部分人生体验,会随着云服务一起,消散在茫茫赛博空间。

订阅,给我打钱

“你蛾子在我手上,打钱”。

越来越多的云服务都采取订阅制了,这是一门来钱的好生意。

最初的时候,对方在说:“把家当放进我这里,不要钱,且提供各种增值服务。你把它们放在自己家里,永远享受不到这么多高级功能。”

好家伙,这么厉害,于是把值钱东西都忙不迭地倒腾过去了。

过了一段事件,对方又说:“亲爱的用户,为了给你带来更好地体验,我们需要收一点钱,但是绝对值,未来会给你带来更多增值服务。”

有一句话叫做“众口难调”,增值服务的确不断地添加,但你发现满足地都是别人地口味,自己根本没兴趣使用。

于是慢慢的,这笔订阅费成为一笔订阅税,说白了就是一笔租金,为你把自己家当放在别人家里付费。

定制成为奢望

打开 Android 系统,面对琳琅满目的 App,你发现自己只是一个提线木偶。尽管我手机 CPU 有 8 个核心,有 8 GB 内存,比曾经的个人工作站性能还要高。

不论是将一个 App 里的文字收藏进另一个 App 里的笔记,还是保存一段好玩的视频,都比登天还难。

更不用说定制一个符合自己习惯的 workflow 了。

一个 App 怎么用,有那些功能,这些你说的都不算,而是有产品经理为你“量身定制”。

久之,人失去了创造性。

手机

手机是近年来最大的技术变革,推动了近十年移动互联网的浪潮。

如今智能设备的性能越来越高,价格越来越低,智能化程度也越来越高。

除了 Feed 流还有什么?

随着移动互联网步入下半场,手机的发展也显现出一些瓶颈。

我使用的大部分 App,都可以概括为推荐算法下的 Feed 流资讯

无法定制,限制创造性

在 Emacs 里,用户真正位于中心位置。如果他想将项目与 Org Agenda 相结合,他自己通过定制就能做到。

而在 Android 系统里、在 Web 云服务里,你什么都做不到。

手机、平板、电脑协同

近年来,开始有厂商注重跨设备协同。

但是受限于不同终端采用的操作系统不同,协同的功能有很大的局限性。

我理想中的跨端协同是,一个 App,在手机上是什么样,在电脑上就是什么样。同时,不同终端要能实时共享数据状态。还有一点,就是不依赖云服务。

Punk OS

Punk OS 并不是完整操作系统,我是个开发 App 的,Punk OS 说白了还是个 App。

我试图在 App 内打造一个平台,一个用户可定制,激发用户创造性的平台。

跨端协同

多设备互通。只要在统一互联网下,手机和电脑、电视可同时使用一个 App,数据实时共享。

我选择将手机作为整套系统的大脑,所有数据都存储在手机里,而电脑只是远程访问手机中的数据。

手机的性能早已不再是瓶颈。背后的思考更多在于终端的实体属性。

手机的便携性是最强的,几乎成为人的体外器官,人不论走到哪里都有手机相伴。

手机是 7x24 的随身智能终端。

跨端协同的 App 形态

跨端 App 早已不是新鲜事,“一次编写,多端运行”,这是跨端技术喊了一遍又一遍的口号。

但是,运行和协同是两码事,它们之间有一道鸿沟——同步问题。

对于笔记、知识管理类工具,如 Obsidian、Logseq,有一个经久不衰的问题,是电脑如何与手机之间同步?

微软有 OneDrive,苹果有 iCloud,第三方还有群晖、坚果的同步盘,能够满足实时性不高的同步需求。

但是对于跨端实时同步,这是一个无解的问题。

可能有人会说这是伪需求,为什么要在手机、平板上写笔记?

要知道,互联网大厂们,花了成千上万亿研究数据如何在机房间同步,异地多活,智能扩容。

跨端 App 的状态协同只是一个技术问题,因为不符合商业利益,研究的人少,原因是一旦用户把数据留在了自己手里,厂商就没法上演“数据代管”的好戏了。

100% 掌握个人数据

你的手机就是你的个人云。

我甚至想把这句话作为 Punk OS 的口号。

什么是云?云是一个永远在线的计算机。而手机也满足这一特点。

所有的数据不再需要传到云端,而是都存储在手机中,存储在同一处

带来的好处是你可以自如组合、挖掘这些信息。

新型 App 应用形态

现有的 App 设计方式简直愚蠢至极。不论是产品的研发效率,还是用户的使用生产力,都低下到出奇。

每个 App 都是一座孤岛。App 的层叠页面设计是悲剧。是对人机交互理论的一种倒退。

在新的 OS 中,选择废除页面回退栈,采用基于窗口的交互。

并且以数据(文件)为中心,围绕一些列基本操作(查看、编辑),形成标准化 Widget。

一个 App 就是一个窗口,通过标准化 Widget,对数据、文件进行可视化操作。

这样设计的好处是,一个 App 本身是一个组件库,我可以组合、服用多个 App 的组件、数据源,形成新的 App。或者,将两个 App 合并成一个新 App。

可定制性

我希望 Punk OS 像 Emacs 一样,系统的每一个部分都是可定制、可扩展的。

我需要引入一种 Lisp 脚本语言,形成一个 Runtime,整个系统在它的驱使下工作。

分布式设计

App 只是数据逻辑的集中存储方。

但仍然可以采用网络分布式设计,通过网络引入更多的算力、存储空间。

只不过是更改了主从关系,用户成了 Server,云成了 Client。

仓库地址

虽然本周的内容听起来更像是 YY,但实际上我已经在开始缓慢的尝试。

仓库地址是:maxiee/punk_os (github.com)

Punk OS 是一个 Flutter 跨端程序,未来我打算引入 WebAssembly 和 JavaScript,来实现更强大的灵活性。

开发进展

听起来高大上,实际开发起来都是一些常规技术。

Socket 通信

Server 与 Client 之间采用 Socket 通信。在 C/S 之间建立起一条双工的长连接,各种协同、通信,都是在这条长连接下完成的。

RPC 框架

我开发了一套简单的 RPC 框架,当进行一个逻辑调用的时候,如果是 Server 端,则完成本地调用,如果是 Client 端,则通过 RPC 远程调用 Server,这样实现了所有逻辑套作都在 Server 侧进行,保障了逻辑一致性。

分布式状态管理器

对于现代化前端来说,单机状态管理器比较成熟了,比如 Redux、Provider,当状态变化时,App 内各处响应式地更新状态。

这里进行了扩展,变成分布式。具体来说,指的是:

  1. Client 不存储状态,而是远程订阅 Server 状态
  2. Server 状态变化后,不仅本地状态要通信,也要远程通知状态更新

除了状态声明外,状态操作也要扩展:

  1. 对于状态操作,如果是 Server 发起走本地调用,如果是 Client 发起,走 RPC 调用

跨端同构

抹平 Punk OS 的底层之后,开发上层 App 时就比较美妙了。

看似时在开发一个普通的 App,实则是在开发多个 App,既有桌面的,也有手机,并且它们之间能实时协同!

在 Flutter 的加持之下,它们的展示实现了像素级别的对齐,又像是同一个 App,完全基于一份 Codebase。

RayDB 数据库

由于将数据存储在手机上,因此我需要为手机寻找一个数据库。

我尝试了几个 Dart 数据(Unqlite、Hive、Isar)都无法满足我的需求。我的需求是什么:

  1. 灵活:Schemaless,NoSQL,方便我灵活修改数据表结构
  2. 弱 ORM:传入 Map 即可存储数据,无需编译时代码生成,无需 DAO
  3. 稳定:能够支撑数十 GB、数百 GB 的数据量
  4. 单机嵌入式数据库

当然,用单机嵌入式数据库存数十 GB、数百 GB 的数据,本身就有点疯狂。即使是稳定的 SQLite,在这么大的数据下,也容易 corupt。之前读过一篇微信的文章,说手机存在太多的不确定性,比如写入过程中手机没电关机,就有可能造成数据库损坏。

看了一圈之后,矮子里面拔大个,最稳定的还是 SQLite。但是 SQLite 是关系型的,不满足我的 NoSQL 需要。

于是,我挖了个坑,在 Dart 下基于 SQLite 封装一个 NoSQL 数据库。这就是 RayDB,仓库地址:maxiee/ray_db: a Dart/Flutter NoSQL Database based on SQLite. (github.com)

展望

这个项目是我在工作之余自娱自乐的,搞着玩儿为主,大家不要报太高的期望,可能热情一过我就弃坑了……

有时间的话我会断断续续更新,主要的问题还是在于工作太忙,属于自己的时间太少。

目前 PunkOS 的问题在于,数据没有地方承接,因此接下来可能会高优开发 RayDB,存储功能开发完毕后。我可能会再开源一个基于 Socket 的分布式调用框架,并给 RayDB 基于这个分布式框架,扩展出一个分布式的数据库版本,使得 PunkOS 的 Client 可以远程操作、订阅 Server 上的数据库。

当 PunkOS 的基础设施(分布式数据库、分布式逻辑层)就为之后,再进行上层业务开发就会舒坦多了。

我脑中还在构思动态化的事情,Dart 语言是静态的,不够灵活。我希望系统最终是以 REPL 驱动的。这里我有两个选择,一个是引入 JavaScript 引擎,未来 PunkOS 的主题由 JavaScript 来驱动,另一个选择是引入 WebAssembly,通过动态运行 wasm 脚本、二进制来驱动系统。后者有一点是缺少 GC,在变成复杂度上要上升很多。如此说来,JavaScript 是一个不错的选择。